import java.util.ArrayList;
import java.util.List;

public class CombineAndArrangement {
    private static List<Integer> tmpArr = new ArrayList<>();
    private static List<List<Integer>> lists = new ArrayList<>();
    public static void main(String[] args) {
        int [] com = {1,2,3,4};
        int k = 3;
        if(k > com.length || com.length <= 0){
            return ;
        }
        System.out.println("组合结果：");
        combine(0 ,k ,com);
    }

    /**
     * 组合
     * 按一定的顺序取出元素，就是组合,元素个数[C arr.len 3]
     * @param index 元素位置
     * @param k 选取的元素个数
     * @param arr 数组
     */
    public static void combine(int index,int k,int []arr) {
        if(k == 1){
            for (int i = index; i < arr.length; i++) {
                tmpArr.add(arr[i]);
                lists.add(tmpArr);
                System.out.print(tmpArr.toString() + ",");
                tmpArr.remove((Object)arr[i]);
            }
        }else if(k > 1){
            for (int i = index; i <= arr.length - k; i++) {
                tmpArr.add(arr[i]); //tmpArr都是临时性存储一下
                combine(i + 1,k - 1, arr); //索引右移，内部循环，自然排除已经选择的元素
                tmpArr.remove((Object)arr[i]); //tmpArr因为是临时存储的，上一个组合找出后就该释放空间，存储下一个元素继续拼接组合了
            }
        }else{
            return ;
        }
    }
}
